// PART OF THE MACHINE SIMULATION. DO NOT CHANGE.

package nachos.machine;

/**
 * An object that maintains Nachos runtime statistics.
 */
public final class Stats {
	/**
	 * Allocate a new statistics object.
	 */
	public Stats() {
	}

	/**
	 * Print out the statistics in this object.
	 */
	public void print() {
		System.out.println("Ticks: total " + totalTicks + ", kernel "
				+ kernelTicks + ", user " + userTicks);
		System.out.println("Disk I/O: reads " + numDiskReads + ", writes "
				+ numDiskWrites);
		System.out.println("Console I/O: reads " + numConsoleReads
				+ ", writes " + numConsoleWrites);
		System.out.println("Paging: page faults " + numPageFaults
				+ ", TLB misses " + numTLBMisses);
		System.out.println("Network I/O: received " + numPacketsReceived
				+ ", sent " + numPacketsSent);
	}

	/**
	 * The total amount of simulated time that has passed since Nachos started.
	 */
	public long totalTicks = 0;
	/**
	 * The total amount of simulated time that Nachos has spent in kernel mode.
	 */
	public long kernelTicks = 0;
	/**
	 * The total amount of simulated time that Nachos has spent in user mode.
	 */
	public long userTicks = 0;

	/** The total number of sectors Nachos has read from the simulated disk. */
	public int numDiskReads = 0;
	/** The total number of sectors Nachos has written to the simulated disk. */
	public int numDiskWrites = 0;
	/** The total number of characters Nachos has read from the console. */
	public int numConsoleReads = 0;
	/** The total number of characters Nachos has written to the console. */
	public int numConsoleWrites = 0;
	/** The total number of page faults that have occurred. */
	public int numPageFaults = 0;
	/** The total number of TLB misses that have occurred. */
	public int numTLBMisses = 0;
	/** The total number of packets Nachos has sent to the network. */
	public int numPacketsSent = 0;
	/** The total number of packets Nachos has received from the network. */
	public int numPacketsReceived = 0;

	/**
	 * The amount to advance simulated time after each user instructions is
	 * executed.
	 */
	public static final int UserTick = 1;
	/**
	 * The amount to advance simulated time after each interrupt enable.
	 */
	public static final int KernelTick = 10;
	/**
	 * The amount of simulated time required to rotate the disk 360 degrees.
	 */
	public static final int RotationTime = 500;
	/**
	 * The amount of simulated time required for the disk to seek.
	 */
	public static final int SeekTime = 500;
	/**
	 * The amount of simulated time required for the console to handle a
	 * character.
	 */
	public static final int ConsoleTime = 100;
	/**
	 * The amount of simulated time required for the network to handle a packet.
	 */
	public static final int NetworkTime = 100;
	/**
	 * The mean amount of simulated time between timer interrupts.
	 */
	public static final int TimerTicks = 500;
	/**
	 * The amount of simulated time required for an elevator to move a floor.
	 */
	public static final int ElevatorTicks = 2000;
}
